home *** CD-ROM | disk | FTP | other *** search
/ Introducing the New Way to Shop from Home / Iceland.iso / pc / internetaccess.dir / 00300_Script_Multi-State Button < prev    next >
Text File  |  2003-03-05  |  12KB  |  417 lines

  1. -- DESCRIPTION --
  2.  
  3. on getBehaviorDescription me
  4.   return \
  5.     "MULTISTATE TOGGLE BUTTON" & RETURN & RETURN & \
  6.     "This behavior toggles the sprite it is attached to between two states: OFF and ON. " & \
  7.     "In each state, the member of the sprite is set according to the position of the mouse (elsewhere, rollover, mouseDown)." & RETURN & \
  8.     "The behavior returns the current state of the button in response to a #ToggleButton_State call." & RETURN & RETURN & \
  9.     "RADIO BUTTON GROUP" & RETURN & \
  10.     "To create a group of radio buttons, give each button in the same group the same ID. " & \
  11.     "Switching one button in the group on will switch all others off." & RETURN & RETURN & \
  12.     "PERMITTED MEMBER TYPES" & RETURN & \
  13.     "Graphic" & RETURN & RETURN & \
  14.     "PARAMETERS:" & RETURN & \
  15.     "-- OFF state --" & RETURN & \
  16.     "* Standard member (when mouse is elsewhere)" & RETURN & \
  17.     "* Rollover member" & RETURN & \
  18.     "* MouseDown member" & RETURN & \
  19.     "-- ON state --" & RETURN & \
  20.     "* Standard member" & RETURN & \
  21.     "* Rollover member" & RETURN & \
  22.     "* MouseDown member" & RETURN & \
  23.     "-- COMMAND --" & RETURN & \
  24.     "* Sent when the button is switched ON" & RETURN & \
  25.     "* Sent when the button is switched OFF" & RETURN & \
  26.     "-- Optional --" & RETURN & \
  27.     "* Toggle group ID (to create a group of radio buttons)" & RETURN & RETURN & \
  28.     "If members are placed consecutively in the cast in this order then default values can be used to create the button."
  29. end getBehaviorDescription
  30.  
  31.  
  32. on getBehaviorTooltip me
  33.   return \
  34.     "Create an ON/OFF button which reacts to rollovers and clicks. " & \
  35.     "Use several such buttons together as a radio button group."
  36. end getBehaviorTooltip
  37.  
  38.  
  39.  
  40. -- NOTES FOR DEVELOPERS --
  41. --
  42. -- This behavior communicates extensively with other sprites.  Since there
  43. -- may be up to 1000 sprites, it is important to use sendAllSprites with
  44. -- prudence.  Indeed, this behavior only uses sendAllSprites once, in the
  45. -- Initialize handler.
  46. --
  47. -- ToggleButton_GroupRollCall
  48. -- The purpose of the call is to identify all other members of the radio 
  49. -- button group.  The behaviors that field the call add their object reference
  50. -- to a list, ourGroupList.  Each behavior stores a pointer to this list.
  51. -- Subsequent communications are of the form:
  52. --
  53. --    call (#customMessage, ourGroupList, additionalParameters)
  54. --
  55. -- This limits the messaging process to only those sprites which need to know.
  56. --
  57. -- ToggleButton_MouseDownList
  58. -- Lists can be used to make information available to other sprites without
  59. -- sending any messages.  All behaviors in a group also share a pointer to an
  60. -- ourMouseDown list.  Whenever the user clicks on one of the members, the
  61. -- unique item in this list is set to TRUE.  When the mouse is released, it
  62. -- is set to FALSE.  All buttons in the group know instantaneously if any
  63. -- member of the group has been clicked.  This means that if the mouse is
  64. -- clicked on one button in the group, other group members will switch to
  65. -- their mouseDown state as the mouse is draggged over them
  66. --
  67. -- ToggleButton_Rollover
  68. -- When the mouse is released, the clickOn sprite asks each other group
  69. -- member in turn if the mouse is currently over it.  If none respond, then
  70. -- ourMouseDown is set to [FALSE].  If any buttons respond, then the
  71. -- mouseUp event sent to the topmost button will activate its Toggle handler. 
  72. --
  73. -- ToggleButton_Off
  74. -- When a button is toggled on, it instructs all others in the group to switch
  75. -- themselves off.
  76. --
  77. -- ToggleButton_State, ToggleButton_ActiveButton
  78. -- These two calls are not used in the behavior itself.  they are included
  79. -- to let you know the state of a particular button, or to know which button
  80. -- in a given group is currently ON.
  81. --
  82. -- If you have only one button, then you can use the ToggleButton_State
  83. -- call with no parameters.  If there are several buttons, then you can either
  84. -- send an empty list out to a given group, and receive a list of the state of
  85. -- each button in reply.
  86. --
  87. -- ToggleButton_ActiveButton should be sent to a particular group.  You
  88. -- must include an empty property list in your call, and will receive in reply
  89. -- a list of the form: [#sprite: <spriteNum>, #behavior: <object reference>]
  90. --
  91. --
  92. --
  93. -- HISTORY --
  94. --
  95. -- 11 September 1998, written for the D7 Behaviors Palette by James Newton
  96. --  5 January   2000: updated to D8 <km>
  97.  
  98.  
  99.  
  100.  
  101. -- PROPERTIES --
  102.  
  103. property spriteNum
  104. property mySprite
  105. -- author-defined parameters
  106. property myOffMember
  107. property myOffOverMember
  108. property myOffDownMember
  109. property myOffCommand
  110. property myOnMember
  111. property myOnOverMember
  112. property myOnDownMember
  113. property myOnCommand
  114. -- internal properties
  115. property theMouseWasUp
  116. property myRollover
  117. property myState      -- TRUE | FALSE: max one button in group TRUE at one time
  118. -- shared properties
  119. property ourID        -- string common to all buttons in a group
  120. property ourGroupList -- list of behaviors in the group
  121. property ourMouseDown -- list indicating if the clickOn is in the group
  122.  
  123.  
  124.  
  125. -- EVENT HANDLERS --
  126.  
  127. on beginSprite me
  128.   Initialize me
  129. end beginSprite
  130.  
  131.  
  132. on prepareFrame me
  133.   CheckForRollover me
  134. end prepareFrame
  135.  
  136.  
  137. on mouseDown me
  138.   ClickOn me
  139. end mouseDown
  140.  
  141.  
  142. on mouseUp me
  143.   if ourMouseDown[1] then Toggle me
  144. end mouseUp
  145.  
  146.  
  147. on mouseUpOutside me
  148.   CheckGroupForClick me
  149. end mouseUpOutside
  150.  
  151.  
  152.  
  153. -- CUSTOM HANDLERS --
  154.  
  155. on Initialize me -- sent by beginSprite
  156.   mySprite = sprite(me.spriteNum)
  157.   ourGroupList = []
  158.   
  159.   -- Insurance: properties are indeed #members
  160.   myOffMember     = member (myOffMember)
  161.   myOffOverMember = member (myOffOverMember)
  162.   myOffDownMember = member (myOffDownMember)
  163.   myOnMember      = member (myOnMember)
  164.   myOnOverMember  = member (myOnOverMember)
  165.   myOnDownMember  = member (myOnDownMember)
  166.   
  167.   sendAllSprites (#ToggleButton_GroupRollCall, ourID, ourGroupList)
  168.   call (#ToggleButton_MouseDownList, ourGroupList, [FALSE])
  169. end Initialize
  170.  
  171.  
  172.  
  173. on CheckForRollover me -- sent by prepareFrame
  174.   mouseOverMe = (the rollover = me.spriteNum)
  175.   if myRollover = mouseOverMe then
  176.     if theMouseWasUp = the mouseUp then
  177.       exit -- Nothing has changed
  178.       
  179.     else
  180.       theMouseWasUp = the mouseUp
  181.       if mouseOverMe then
  182.         if the mouseUp then
  183.           -- Mouse was clicked elsewhere then dragged and released over button
  184.           case myState of
  185.             TRUE:  mySprite.member = myOnOverMember
  186.             FALSE: mySprite.member = myOffOverMember
  187.           end case
  188.         end if
  189.       end if
  190.     end if
  191.   else
  192.     
  193.     set myRollover to mouseOverMe
  194.     if ourMouseDown[1] then
  195.       if myRollover then
  196.         case myState of
  197.           TRUE:  mySprite.member = myOnDownMember
  198.           FALSE: mySprite.member = myOffDownMember
  199.         end case
  200.       else
  201.         -- Indicate that mouseUpOutside will have no effect
  202.         case myState of
  203.           TRUE:  mySprite.member = myOnMember
  204.           FALSE: mySprite.member = myOffMember
  205.         end case
  206.       end if
  207.     else
  208.       if not the mouseDown and myRollover then
  209.         case myState of
  210.           TRUE:  mySprite.member = myOnOverMember
  211.           FALSE: mySprite.member = myOffOverMember
  212.         end case
  213.       else
  214.         -- No reaction if mouse was clicked elsewhere and dragged to button
  215.         case myState of
  216.           TRUE:  mySprite.member = myOnMember
  217.           FALSE: mySprite.member = myOffMember
  218.         end case
  219.       end if
  220.     end if
  221.   end if
  222. end CheckForRollover
  223.  
  224.  
  225.  
  226. on ClickOn me -- sent by mouseDown, CheckForRollover
  227.   ourMouseDown[1] = TRUE
  228.   case myState of
  229.     TRUE:  mySprite.member = myOnDownMember
  230.     FALSE: mySprite.member = myOffDownMember
  231.   end case
  232. end ClickOn
  233.  
  234.  
  235.  
  236. on Toggle me, whichState -- sent by mouseUp, ToggleButton_Off
  237.   if voidP (whichState) then
  238.     myState = not myState
  239.   else
  240.     myState = whichState
  241.   end if
  242.   ourMouseDown[1] = FALSE
  243.   theMouseWasUp = TRUE
  244.   case myState of
  245.     TRUE: 
  246.       mySprite.member = myOnMember
  247.       updateStage
  248.       do myOnCommand
  249.     FALSE:
  250.       mySprite.member = myOffMember
  251.       updateStage
  252.       do myOffCommand
  253.   end case
  254.   if ourGroupList.count() then
  255.     if myState then
  256.       call (#ToggleButton_Off, ourGroupList, me)
  257.     end if
  258.   end if
  259. end Toggle
  260.  
  261.  
  262.  
  263. on CheckGroupForClick me -- sent by mouseUpOutside
  264.   groupRollover = call (#ToggleButton_Rollover, ourGroupList, [])
  265.   if not groupRollover.count() then
  266.     ourMouseDown[1] = FALSE
  267.   end if
  268. end Disactivate
  269.  
  270.  
  271.  
  272. -- PUBLIC METHODS (responses to #sendSprite, #sendAllSprites, #call) --
  273.  
  274. on ToggleButton_GroupRollCall me, groupID, groupList
  275.   -- sent by each new button that joins the group
  276.   if groupID = ourID then
  277.     ourGroupList = groupList
  278.     ourGroupList.append(me)
  279.   end if
  280.   return groupList
  281. end ToggleButton_GroupRollCall
  282.  
  283.  
  284. on ToggleButton_MouseDownList me, mouseDownList
  285.   ourMouseDown = mouseDownList
  286. end ToggleButton_MouseDownList
  287.  
  288.  
  289. on ToggleButton_Rollover me, theList
  290.   if the rollover = me.spriteNum then
  291.     theList.append(me.spriteNum)
  292.   end if
  293.   return theList
  294. end ToggleButton_Rollover
  295.  
  296.  
  297. on ToggleButton_Off me, callingBehavior
  298.   -- sent when the member of the group which is toggled ON
  299.   if callingBehavior = me then exit
  300.   
  301.   Toggle me, FALSE
  302. end ToggleButton_Off
  303.  
  304.  
  305. on ToggleButton_State me, groupID, statesList
  306.   if not voidP (groupID) then
  307.     if groupID <> ourID then exit
  308.   end if
  309.   
  310.   case ilk (statesList) of
  311.     #void: return myState
  312.     #list:
  313.       statesList.append(myState)
  314.     #propList:
  315.       statesList.addProp(me.spriteNum, myState)
  316.   end case
  317.   return statesList
  318. end ToggleButton_State
  319.  
  320.  
  321. on ToggleButton_ActiveButton me, groupID, theList
  322.   if not voidP (groupID) then
  323.     if groupID <> ourID then exit
  324.   end if
  325.   
  326.   if not listP (theList) then
  327.     theList = [:]
  328.   end if
  329.   if not theList.count() and myState then
  330.     theList.addProp (#sprite, me.spriteNum)
  331.     theList.addProp (#behavior, me)
  332.   end if
  333.   return theList
  334. end ToggleButton_ActiveButton
  335.  
  336.  
  337.  
  338.  
  339. on isOKToAttach (me, aSpriteType, aSpriteNum)
  340.   
  341.   tIsOK = 0  
  342.   if aSpriteType = #graphic then
  343.     tIsOK = 1
  344.   end if  
  345.   
  346.   return(tIsOK)  
  347. end on
  348.  
  349.  
  350.  
  351. -- AUTHOR-DEFINED PARAMETERS --
  352.  
  353. on getPropertyDescriptionList me
  354.   
  355.   theMember    = sprite(the currentSpriteNum).member
  356.   theMemberNum = theMember.number
  357.   
  358.   return \
  359. [ \
  360.  #myOffMember: \
  361.  [ \
  362.   #comment: "-OFF STATE- Standard member:", \
  363.   #format:  #graphic, \
  364.   #default:  theMember \
  365.  ], \
  366.  #myOffOverMember: \
  367.  [ \
  368.   #comment: "Rollover member", \
  369.   #format:  #graphic, \
  370.   #default:  member (theMemberNum + 1) \
  371.  ], \
  372.  #myOffDownMember: \
  373.  [ \
  374.   #comment: "MouseDown member", \
  375.   #format:  #graphic, \
  376.   #default:  member (theMemberNum + 2) \
  377.  ], \
  378.  #myOnMember: \
  379.  [ \
  380.   #comment: "-ON STATE- Standard member", \
  381.   #format:  #graphic, \
  382.   #default:  member (theMemberNum + 3) \
  383.  ], \
  384.  #myOnOverMember: \
  385.  [ \
  386.   #comment: "Rollover member", \
  387.   #format:  #graphic, \
  388.   #default:  member (theMemberNum + 4) \
  389.  ], \
  390.  #myOnDownMember: \
  391.  [ \
  392.   #comment: "MouseDown member", \
  393.   #format:  #graphic, \
  394.   #default:  member (theMemberNum + 5) \
  395.  ], \
  396.  #myOnCommand: \
  397.  [ \
  398.   #comment: "-COMMAND SENT- when switched ON", \
  399.   #format:  #string, \
  400.   #default:  "sendAllSprites #Toggle_On, the currentSpriteNum" \
  401.  ], \
  402.  #myOffCommand: \
  403.  [ \
  404.   #comment: "when switched OFF", \
  405.   #format:  #string, \
  406.   #default:  "sendAllSprites #Toggle_Off, the currentSpriteNum" \
  407.  ], \
  408.  #ourID: \
  409.  [ \
  410.   #comment: "ID string for the group", \
  411.   #format:  #string, \
  412.   #default:  EMPTY \
  413.  ] \
  414. ]
  415. end getPropertyDescriptionList
  416.  
  417.